package JUC.第04章_锁;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 乐观锁/悲观锁
 * 乐观锁与悲观锁不是指具体的什么类型的锁，而是指看待并发同步的角度。
 * 悲观锁认为对于同一个数据的并发操作，一定是会发生修改的，哪怕没有修改，也会认为修改。
 *      因此对于同一个数据的并发操作，悲观锁采取加锁的形式。悲观认为，不加锁的并发操作一定会出问题。
 * 乐观锁则认为对于同一个数据的并发操作，是不会发生修改的。
 *      在更新数据的时候，会采用尝试更新，不断重新的方式更新数据。
 *      乐观的认为，不加锁的并发操作是没有事情的。
 *
 * 从上面的描述我们可以看出，
 *      悲观锁适合写操作非常多的场景，
 *      乐观锁适合读操作非常多的场景，不加锁会带来大量的性能提升。
 * 悲观锁在Java中的使用，就是利用各种锁。
 * 乐观锁在Java中的使用，是无锁编程，常常采用的是CAS算法，典型的例子就是原子类，通过CAS自旋实现原子操作的更新。
 *
 */
public class B1_乐观锁和悲观锁 {
    public static void main(String[] args) {
        悲观锁1();
        悲观锁2();
        乐观锁1();
    }

    private static void 悲观锁1() {
        //悲观锁 案例
        synchronized (B1_乐观锁和悲观锁.class){
            //悲观锁逻辑
        }
    }

    private static void 悲观锁2() {
        //悲观锁 案例
        ReentrantLock lock = new ReentrantLock();
        lock.lock();
        //悲观锁逻辑
        lock.unlock();
    }
    private static void 乐观锁1() {
        AtomicInteger atomicInteger = new AtomicInteger();
        atomicInteger.incrementAndGet();//乐观锁  底层用的 Unsafe 原语且使用 CAS 比较并交换
    }
}
